在ZendVM
中魔术方法、反射函数、call_user_func
、call_user_func_array
是由C
函数实现的,并未opcode
,这些操作可能会与Swoole
底层的协程调度发生冲突。因此严禁在这些地方使用协程的API
。请使用PHP
提供的动态函数调用语法来实现相同的功能。
在
4.0
版本后已解决此问题,可以在任意函数中使用协程,下列禁用场景仅针对2.0-3.0
版本
__get
__set
__call
__callStatic
__toString
__invoke
__destruct
call_user_func
call_user_func_array
ReflectionFunction::invoke
ReflectionFunction::invokeArgs
ReflectionMethod::invoke
ReflectionMethod::invokeArgs
array_walk
/array_map
call_user_func
call_user_func_array
array_walk
/array_map
ReflectionFunction::invoke
ReflectionFunction::invokeArgs
ReflectionMethod::invoke
ReflectionMethod::invokeArgs
$func = "test";
$retval = call_user_func($func, "hello");
$func = "test";
$retval = $func("hello");
$retval = call_user_func(array($obj, "test"), "hello");
$retval = call_user_func_array(array($obj, "test"), "hello", array(1, 2, 3));
$method = "test";
$args = array(1, 2, 3);
$retval = $obj->$method("hello");
$retval = $obj->$method("hello", ...$args);